/*-+-*****************************************************************************
 Copyright (C) 2009-2012 Oceanside Software Corporation (R)
 Dallas, Texas

 Author       : Jason T. Brower
 Purpose      : This file is part of a point-of-sale software package
                originally written for Table-Service Restaurants.
              
 Date         : July 8th of 2012
              
 History      : The application that this software file belongs to was 
                written over a 3-Year period.  The first version was written
                in C# .Net 3.5 using Windows Forms.  Being new to .Net at
                the time, I soon learned of Windows Presentation Foundation,
                liked the graphics capabilities and databinding so I
                migrated to WPF.  When the .Net 4.0 framework was released
                the application was migrated from 3.5 to 4.0. Now today,
                .Net 4.5 RC is out and I was already in process of migrating
                before I made this public.
                
Excuse Me     : Please excuse the coding style, it is not representative of
                my typical work.  During the three years I was under a very
                tight budget, constantly running out of funding and was 
                working 18 hour days hyped up on 5-Hour Energy.  The 
                design is not textbook.  It is monolythic because of
                previous issues I will not get into.  There are few comments
                in the code and the ones that are there may be incorrect.
                
What it is not: This is not the exact version that I took through PA-DSS 2.0
                nor is it the exact version running at my customer sites.
                I removed some details for security purposes including some
                encryption algorithms.  The reporting was removed because
                I was including a third party library that cannot be 
                published with this Open Source.
                
What it is    : This application has been running at high volume restaraunts
                for over a year.  It never freezes, crashes or does anything
                unexpected.  So long as it is built, installed and configured
                correctly, it is a strong system that we can all enhance.

Contact       : Please note that I can no longer work for free.  However, you
                can reach me at information@oceansidesw.com.                                                      

*********************************************************************************/
using System.Data.Objects;
using System.Linq;
using System.Windows;

using System.Windows.Controls;
#if _LOCALDB
  using Oceanside.LocalDB;
#else
using Oceanside.RemoteDB;
#endif
namespace Oceanside
{
    /// <summary>
    /// Interaction logic for PageLogin.xaml
    /// </summary>
    public partial class PagePciLogImp : PageImpBaseClass
    {
        int listPageScrollIndex = 0;
        private const int CONST_LINE_ITEMS_PER_VIEW = 10;
        ListView listviewLog;

        /// <summary>
        /// Constructor
        /// </summary>
        public PagePciLogImp(ShineButton_95_50 upButton, ShineButton_95_50 downButton, ListView listviewLog)
        {
            this.listviewLog = listviewLog;

            upButton.ShineButtonClicked += new RoutedEventHandler(upButton_ShineButtonClicked_NOTHROW);
            downButton.ShineButtonClicked += new RoutedEventHandler(downButton_ShineButtonClicked_NOTHROW);
            this.ButtonNumber = "";
            this.ButtonLabelText = " Syslog Viewer";
            mNewEntityIsDisabled = true;
            mDeleteEntityIsDisabled = true;
            mCancelIsDisabled = true;
            mEditIsDisabled = true;
            mSaveIsDisabled = true;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="source"></param>
        public override void UpdateUsersEntitySource()
        {
            using (DominicaEntities logContext = new DominicaEntities(DominicaEntities.GetEfConString()))
            {
                var query = from SYSLOG in logContext.PCILOGS orderby SYSLOG.DateStamp descending select SYSLOG;
                ObjectResult oresult = ((ObjectQuery)query).Execute(MergeOption.AppendOnly);
                InvokeUpdateView_NOTHROW(oresult);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        private void InvokeUpdateView_NOTHROW(object obr)
        {
            try
            {
                if (Constants.MainDispatcher.CheckAccess())
                {
                    listviewLog.ItemsSource = (ObjectResult)obr;
                }
                else
                {
                    Constants.MainDispatcher.Invoke(new Types.SingleParamDelegateType(InvokeUpdateView_NOTHROW), obr);
                }
            }
            catch (System.Exception exc)
            {
                Constants.ErrorDispatcher.Notify(Error.EType.E_PAGESYSLOG_INVOKE_UPDATEVIEW, exc);
            }
        }

        /// <summary>
        /// Scrolls the customers ticket up and down.
        /// </summary>
        /// <param Name="directionUp"></param>
        public void ListScrollClicked(bool directionUp)
        {
            if (directionUp)
            {
                listPageScrollIndex -= CONST_LINE_ITEMS_PER_VIEW;

                ///Since we just went ahead and knocked off an entire view panels worth, we
                ///need to assure we didn't drive negative.
                if (listPageScrollIndex < 0)
                {
                    listPageScrollIndex = 0;
                }
            }
            else  ///Must be scroll down
            {
                listPageScrollIndex += CONST_LINE_ITEMS_PER_VIEW;

                ///Make sure we didn't go too far, correct if we did by placing the view 
                ///at the end.
                if (listPageScrollIndex >= listviewLog.Items.Count)
                {
                    listPageScrollIndex = listviewLog.Items.Count - 1;
                }
            }
            UpdateTicketFocus();
        }
        /// <summary>
        /// Should be called whenever we delete an item from the customer ticket or
        /// add or scroll items.
        /// </summary>
        private void UpdateTicketFocus()
        {
            ///Sanity bounds customerCheck even though it is done elsewhere often.
            if ((listPageScrollIndex >= 0) && (listPageScrollIndex < listviewLog.Items.Count))
            {
                if (listviewLog.Items != null && listviewLog.Items.Count != 0)
                {
                    listviewLog.ScrollIntoView(listviewLog.Items[listPageScrollIndex]);
                    ///Select the new item we just put focus on.
                    listviewLog.SelectedItem = listviewLog.Items[listPageScrollIndex];
                }
            }
            else
            {
                ///If we jump out of bounds then just set the index to zero.
                listPageScrollIndex = 0;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param Name="sender"></param>
        /// <param Name="e"></param>
        void upButton_ShineButtonClicked_NOTHROW(object sender, RoutedEventArgs e)
        {
            try
            {
                ListScrollClicked(true);
            }
            catch (System.Exception exc)
            {
                Constants.ErrorDispatcher.Notify(Error.EType.E_PAGESYSLOG_SCROLL_UP, exc);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param Name="sender"></param>
        /// <param Name="e"></param>
        void downButton_ShineButtonClicked_NOTHROW(object sender, RoutedEventArgs e)
        {
            try
            {
                ListScrollClicked(false);
            }
            catch (System.Exception exc)
            {
                Constants.ErrorDispatcher.Notify(Error.EType.E_PAGESYSLOG_SCROLL_DOWN, exc);
            }
        }
    }
}
